49. 使用远程shell进行监控和管理

Spring Boot支持集成一个称为'CRaSH'的Java shell,你可以在CRaSH中使用ssh或telnet命令连接到运行的应用,项目中添加以下依赖可以启用远程shell支持:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-remote-shell</artifactId>
 </dependency>

如果想使用telnet访问,你还需添加对org.crsh:crsh.shell.telnet的依赖。

CRaSH运行时需要JDK,因为它要动态编译命令。如果一个基本的help命令都运行失败,你很可能使用的是JRE。

49.1 连接远程shell

远程shell默认监听端口为2000,默认用户名为user,密码为随机生成的,并且在输出日志中会显示。如果应用使用Spring Security,该shell默认使用相同的配置。如果不是,将使用一个简单的认证策略,你可能会看到类似这样的信息:

Using default password for shell access: ec03e16c-4cf4-49ee-b745-7c8255c1dd7e

Linux和OSX用户可以使用ssh连接远程shell,Windows用户可以下载并安装PuTTY

$ ssh -p 2000 user@localhost

user@localhost's password:
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::  (v1.4.1.RELEASE) on myhost

输入help可以获取命令列表,Spring Boot提供metricsbeansautoconfigendpoint命令。

49.1.1 远程shell证书

你可以使用management.shell.auth.simple.user.namemanagement.shell.auth.simple.user.password属性配置自定义的连接证书,也可以使用Spring Security的AuthenticationManager处理登录职责,具体参考CrshAutoConfigurationShellProperties的Javadoc。

49.2 扩展远程shell

有很多有趣的方式可以用来扩展远程shell。

49.2.1 远程shell命令

你可以使用Groovy或Java编写其他的shell命令(具体参考CRaSH文档),Spring Boot默认会搜索以下路径的命令:

  • classpath*:/commands/**
  • classpath*:/crash/commands/**

设置shell.command-path-patterns属性可以改变搜索路径。 如果使用可执行存档(archive),shell依赖的所有类都必须打包进一个内嵌的jar,而不是直接打包进可执行jar或war。

下面是一个从src/main/resources/commands/hello.groovy加载的'hello'命令:

package commands

import org.crsh.cli.Usage
import org.crsh.cli.Command

class hello {

    @Usage("Say Hello")
    @Command
    def main(InvocationContext context) {
        return "Hello"
    }

}

Spring Boot为InvocationContext添加一些其他属性,你可以在命令中访问它们:

属性名称 描述
spring.boot.version Spring Boot的版本
spring.version Spring核心框架的版本
spring.beanfactory 获取Spring的BeanFactory
spring.environment 获取Spring的Environment

49.2.2 远程shell插件

除了创建新命令,你也可以扩展CRaSH shell的其他特性,所有继承org.crsh.plugin.CRaSHPlugin的Spring Beans将自动注册到shell,具体查看CRaSH参考文档